package es.ugr.beequizz.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import es.ugr.beequizz.dao.GenericDAO;
import es.ugr.beequizz.dao.JuegoDAO;
import es.ugr.beequizz.model.Juego;

@Repository
public class JuegoDAOImpl extends GenericDAO implements JuegoDAO  {

	private static final String RECUPERAR_JUEGOS_SQL = "SELECT id, nombre FROM juego";
	
	private static final String RECUPERAR_URL_SQL = "SELECT url FROM juego WHERE id = :id";
	
	private static final String RECUPERAR_JUEGO_PARTIDA_SQL = "SELECT juego_id AS id, nombre FROM partida " +
				"INNER JOIN juego ON (juego.id=partida.juego_id) WHERE partida.id= :idPartida";
	
	/*Demanda para asignar el turno a un jugador*/
	private static final String ASIGNAR_TURNO_SQL ="UPDATE partida SET turno = :siguienteId WHERE id = :partidaId";
	
	/*Demanda para recuperar saber si el jugador tiene el turno de juego o no*/
	private static final String TURNO_SQL = "SELECT turno FROM partida WHERE id = :partidaId";
	
	/*Demanda para recuperar la id del jugador siguiente*/
	private static final String RECUPERAR_SIGUIENTE_SQL = "SELECT siguiente_id FROM partida_usuario WHERE usuario_id = :usuarioId AND partida_id = :partidaId";

	private static final String INCLUIR_JUEGO_SQL = "INSERT INTO juego (nombre, url) VALUES (:nombre, :url)";
	
	private class JuegoRowMapper implements RowMapper<Juego> {
		
		public Juego mapRow(ResultSet result, int arg1) throws SQLException{
			Juego juego = new Juego();
			juego.setId(result.getLong("id"));
			juego.setNombre(result.getString("nombre"));
			
			return juego;
						
		}
		
	} 

	
	public List<Juego> agregarJuegos() {
	
		return template.query(RECUPERAR_JUEGOS_SQL, new JuegoRowMapper());
	}


	public String cargarJuego(Long id) {
		
		Map<String,Object>  params = new HashMap<String, Object>();
		params.put("id", id);
		
		return this.namedTemplate.queryForObject(RECUPERAR_URL_SQL, params, String.class);
	}


	public Juego recuperarJuegoPartida(Long idPartida) {
		

		Map<String,Object>  params = new HashMap<String, Object>();
		params.put("idPartida", idPartida);
		
		
		return namedTemplate.queryForObject(RECUPERAR_JUEGO_PARTIDA_SQL,params, new JuegoRowMapper());
	}


	public void asignarTurno(Long partidaId, Long siguienteId) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("siguienteId", siguienteId);
		params.put("partidaId", partidaId);
		
		namedTemplate.update(ASIGNAR_TURNO_SQL, params);
		
	}


	public Long miTurno(Long partidaId) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("partidaId", partidaId);
		
		return namedTemplate.queryForLong(TURNO_SQL, params);
	}


	public Long recuperarSiguiente(Long partidaId, Long usuarioId) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("usuarioId", usuarioId);
		params.put("partidaId", partidaId);
		
		return namedTemplate.queryForLong(RECUPERAR_SIGUIENTE_SQL, params);
	}


	public void incluirJuego(Juego juego) {
		Map<String, Object> params = new HashMap<String, Object>();
		params.put("url", juego.getUrl());
		params.put("nombre", juego.getNombre());
		namedTemplate.update(INCLUIR_JUEGO_SQL, params);
	}

}
